<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

<!-- Begin Jekyll SEO tag v2.8.0 -->
<title>从 VHDX 文件恢复 (导入) WSL 2 安装 | blog</title>
<meta name="generator" content="Jekyll v3.9.2" />
<meta property="og:title" content="从 VHDX 文件恢复 (导入) WSL 2 安装" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="有时出于某些意外, 导致注册表丢失以致 Windows 丢失了 WSL 安装相关的信息, 将无法使用或者导出 WSL. 不过, 只要还有 WSL 对应的的 VHDX 文件 (虚拟磁盘文件), 在注册表中重建相应的信息之后就能正常使用." />
<meta property="og:description" content="有时出于某些意外, 导致注册表丢失以致 Windows 丢失了 WSL 安装相关的信息, 将无法使用或者导出 WSL. 不过, 只要还有 WSL 对应的的 VHDX 文件 (虚拟磁盘文件), 在注册表中重建相应的信息之后就能正常使用." />
<link rel="canonical" href="https://tsagaanbar.gitee.io/blog/win/restore-wsl-2-from-vhdx-file/" />
<meta property="og:url" content="https://tsagaanbar.gitee.io/blog/win/restore-wsl-2-from-vhdx-file/" />
<meta property="og:site_name" content="blog" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2022-06-16T22:25:25+00:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="从 VHDX 文件恢复 (导入) WSL 2 安装" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2022-06-16T22:25:25+00:00","datePublished":"2022-06-16T22:25:25+00:00","description":"有时出于某些意外, 导致注册表丢失以致 Windows 丢失了 WSL 安装相关的信息, 将无法使用或者导出 WSL. 不过, 只要还有 WSL 对应的的 VHDX 文件 (虚拟磁盘文件), 在注册表中重建相应的信息之后就能正常使用.","headline":"从 VHDX 文件恢复 (导入) WSL 2 安装","mainEntityOfPage":{"@type":"WebPage","@id":"https://tsagaanbar.gitee.io/blog/win/restore-wsl-2-from-vhdx-file/"},"url":"https://tsagaanbar.gitee.io/blog/win/restore-wsl-2-from-vhdx-file/"}</script>
<!-- End Jekyll SEO tag -->

    <link rel="stylesheet" href="/blog/assets/css/style.css?v=5a3a055c96aa4035d7a987d1ed733ff6fc09a8b3">
    <!-- start custom head snippets, customize with your own _includes/head-custom.html file -->

<!-- Setup Google Analytics -->



<!-- You can set your favicon here -->
<!-- link rel="shortcut icon" type="image/x-icon" href="/blog/favicon.ico" -->

<!-- end custom head snippets -->

  </head>
  <body>
    <div class="container-lg px-3 my-5 markdown-body">
      
      <p><a href="https://tsagaanbar.gitee.io/blog/">tsagaanbar's Blog</a></p>
      <h1>从 VHDX 文件恢复 (导入) WSL 2 安装</h1>

      <p>Microsoft 官方以及常见的 WSL 导入导出方式, 都是通过 <code class="language-plaintext highlighter-rouge">wsl --export</code> 生成 tar 文件而使用 <code class="language-plaintext highlighter-rouge">wsl --import</code> 命令完成导入.</p>

<p>但是, 有时候出于某些意外, 比如系统出现严重问题需要重装, 或者其他导致注册表丢失的情况, Windows 丢失了 WSL 安装相关的信息, 将无法使用上述的方式进行导出.</p>

<p>不过, 只要还有 WSL 所在的 VHDX 文件 (虚拟磁盘文件), 就没有问题, 因为 WSL 最关键的就是这个虚拟磁盘文件, 只需要在注册表中重建相应的信息就能正常使用.</p>

<p>有时候 WSL 磁盘文件过大, 导入导出时容易出现问题, 这种方式也是适用的.</p>

<p>本文讲解的思路主要来自于 <a href="https://github.com/microsoft/WSL/issues/4762">Issue #4762 - Microsoft/WSL</a>.</p>

<h2 id="注册表丢失的情况">注册表丢失的情况</h2>

<p>笔者在重装系统之前, 是通过 Microsoft Store 安装的 Ubuntu 发行版. 应用商店中的数据一般在 <code class="language-plaintext highlighter-rouge">%LocalAppData%/Packages</code> <sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> 下.</p>

<p>重置系统 (选择保留个人数据) 后, 数据文件会被 <strong>迁移</strong> 到 <code class="language-plaintext highlighter-rouge">Windows.old</code> 中, 也就是 <code class="language-plaintext highlighter-rouge">X:/Windows.old/Users/%UserName%/AppData/Local/Packages</code> 中.</p>

<p>其中, 商店里安装的 Ubuntu 发行版对应的包名会以 <code class="language-plaintext highlighter-rouge">CanonicalGroupLimited.Ubuntu</code> 开头, 打开对应的目录后, 在 <code class="language-plaintext highlighter-rouge">LocalState</code> 中就能找到 <code class="language-plaintext highlighter-rouge">.vhdx</code> 文件.</p>

<blockquote>
  <p>事实上, 重装系统后, 许多其他软件的数据也能从 <code class="language-plaintext highlighter-rouge">Windows.old</code> 中恢复. 为了防止 <code class="language-plaintext highlighter-rouge">Windows.old</code> 在一段时间后被清清除, 建议及时备份 <code class="language-plaintext highlighter-rouge">Windows.old</code> 中的用户文件.</p>
</blockquote>

<p>可以将 <code class="language-plaintext highlighter-rouge">.vhdx</code> 文件剪切出来, 放在某个目录下, 比如 <code class="language-plaintext highlighter-rouge">D:/wslinstall/ubuntu20.04</code>.</p>

<p>之后, 根据下面的文件模板编写一个 REG 文件, 重建安装信息, 再导入注册表即能恢复 WSL 安装.</p>

<pre><code class="language-reg">Windows Registry Editor Version 5.00

[HKEY_USERS\[SID]\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\{[UUID]}]
"State"=dword:00000001
"DistributionName"="[DISTRO_NAME]"
"Version"=dword:00000002
"BasePath"="\\\\?\\[VHDX_PATH]"
"Flags"=dword:0000000f
"DefaultUid"=dword:000003e8
</code></pre>

<p>复制上述的模板到文本文件中, 并替换其中方括号标注的项 <sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">项</th>
      <th style="text-align: left">替换说明</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">[SID] <sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup></td>
      <td style="text-align: left">打开 “命令提示符”, 使用 <code class="language-plaintext highlighter-rouge">whoami /user</code> 命令获取到自己 (当前用户) 的 SID</td>
    </tr>
    <tr>
      <td style="text-align: left">[UUID]</td>
      <td style="text-align: left">可以去这个 <a href="https://www.uuidgenerator.net/">UUID 生成网站</a> 随机生成一个 UUID</td>
    </tr>
    <tr>
      <td style="text-align: left">[DISTRO_NAME]</td>
      <td style="text-align: left">指定发行版的名称, 比如 <code class="language-plaintext highlighter-rouge">Ubuntu</code></td>
    </tr>
    <tr>
      <td style="text-align: left">[VHDX_PATH]</td>
      <td style="text-align: left">发行版所在的路径, 并将反斜线转义, 比如 <code class="language-plaintext highlighter-rouge">D:\\WSL\\Ubuntu</code></td>
    </tr>
  </tbody>
</table>

<p>比如, 在上文中我们假设文件存储在了 <code class="language-plaintext highlighter-rouge">D:/wslinstall/ubuntu20.04</code> 目录下, 那么一个可用的 REG 文件就类似如下所示:</p>

<div class="language-diff highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">Windows Registry Editor Version 5.00
</span>
[HKEY_USERS\&lt;你的 SID&gt;\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\{8ebf13b4-6ce3-4027-a2c7-f84ab4dad111}]
<span class="err">"State"=dword:00000001</span>
"DistributionName"="Ubuntu 20.04"
<span class="err">"Version"=dword:00000002</span>
"BasePath"="\\\\?\\D:\\wslinstall\\ubuntu20.04"
<span class="err">"Flags"=dword:0000000f</span>
"DefaultUid"=dword:000003e8
</code></pre></div></div>

<p>将内容保存成后缀名为 <em>reg</em> 的文件, 比如一个名为 <em>wsl-info.reg</em> 的文件, 这样在 Windows 资源管理器中双击就可以完成导入.</p>

<p>导入完成后, 就可以在 Windows Termial 或者 <code class="language-plaintext highlighter-rouge">wsl</code> 命令中找到这个发行版了.</p>

<h2 id="需要迁移-wsl-2-的情况">需要迁移 WSL 2 的情况</h2>

<p>类似的, 只需要有 WSL 的 VHDX 文件, 重新建立注册表即可. 注意使用对应用户的 <a href="https://docs.microsoft.com/en-us/windows/security/identity-protection/access-control/security-identifiers" title="Security identifiers - Microsoft Docs">SID</a>.</p>

<h2 id="参考资料">参考资料</h2>

<ul>
  <li><a href="https://dev.to/milolav/manually-installing-wsl2-distributions-41b4#registry-keys">Manually installing WSL2 distributions - DEV Community</a></li>
</ul>

<h3 id="关于-windows-路径名缩写">关于 Windows 路径名缩写</h3>

<ul>
  <li><a href="https://www.howtogeek.com/318177/what-is-the-appdata-folder-in-windows/">What Is the AppData Folder in Windows? (howtogeek.com)</a></li>
  <li><a href="https://www.freecodecamp.org/news/appdata-where-to-find-the-appdata-folder-in-windows-10/">AppData – Where to Find the AppData Folder in Windows 10 (freecodecamp.org)</a></li>
  <li><a href="https://notepad.patheticcockroach.com/4286/windows-special-folders-short-names-something/">Windows special folders short names (%something%) – PCR’s notepad (patheticcockroach.com)</a></li>
  <li><a href="https://answers.microsoft.com/en-us/windows/forum/all/how-do-i-find-appdatalocallow-folders/2e0a0755-6bd4-4fcd-a866-99c0e4da74e4">How do I find AppData\LocalLow folders? - Microsoft Community</a></li>
</ul>

<h3 id="wsl-安装和使用">WSL 安装和使用</h3>

<p>参见 <a href="./working-with-wsl-2/">“使用 WSL 2 进行工作”</a>.</p>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>即 <code class="language-plaintext highlighter-rouge">X:/Users/%UserName%/AppData/Local/Packages</code>. 另见参考资料中 “关于 Windows 路径名缩写”. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>参考 <a href="https://github.com/microsoft/WSL/issues/4762#issuecomment-578545574">@synergies 的评论回复</a>. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:3" role="doc-endnote">
      <p>参考 <a href="https://docs.microsoft.com/en-us/windows/security/identity-protection/access-control/security-identifiers" title="Security identifiers - Microsoft Docs">Security identifiers - Microsoft Docs</a>. <a href="#fnref:3" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>


      
    </div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/anchor-js/4.1.0/anchor.min.js" integrity="sha256-lZaRhKri35AyJSypXXs4o6OPFTbTmUoltBbDCbdzegg=" crossorigin="anonymous"></script>
    <script>anchors.add();</script>
  </body>
</html>
